/* eslint-disable no-unused-vars */
import { Router } from 'vue-router'
import nprogress from 'nprogress'

nprogress.configure({ showSpinner: false })

export const createGuard = async (router: Router) => {
    // 全局前置守卫
    // to: 你将要访问那个路由
    // from: 你从那个路由来
    // next: 路由的放行函数
    router.beforeEach(async (to: any, from: any, next) => {
        if (to.path !== from.path) {
            nprogress.start() // 进度条开始
        }

        const loginPath = '/login'
        const whiteList = [loginPath]

        const { admin, authRoutes, authButtons, adminUserLogout, getAdminUserInfo, initAuthRoute, getAuthRoutes, getAuthButtonPermissions } =
            useAdminStore()

        // 有token信息
        if (admin.accessToken) {
            if (to.path === loginPath) {
                // 有token信息, 访问的是login页面, 放行
                next()
            } else if (admin.name) {
                // 没有authRoutes, 则加载
                if (authRoutes.length === 0) {
                    await getAuthRoutes()
                }
                // 没有authButtons, 则加载
                if (authButtons.length === 0) {
                    await getAuthButtonPermissions()
                }
                // 访问的路由不在路由表里面，则初始化路由表，还是没有则没有权限，有则放行
                if (!router.hasRoute(to.path)) {
                    initAuthRoute()
                }
                next()
            } else {
                // 有token, 但是用户信息不完整，则获取用户信息
                const isSuccess = await getAdminUserInfo()
                if (isSuccess) {
                    next()
                } else {
                    // 获取用户信息失败，可能token过期或者本地存储被修改，退出登录
                    await adminUserLogout()
                    next({ path: loginPath, query: { redirect: to.path } })
                }
            }
        } else {
            // 没有token信息，如果是访问login就放行，否则推到login, 并携带重定向参数
            if (whiteList.includes(to.path)) next()
            else next({ path: loginPath, query: { redirect: to.path } })
        }
    })

    //全局后置守卫
    router.afterEach((to: any) => {
        // 修改doc标题
        document.title = `${import.meta.env.VITE_APP_TITLE} - ${to.meta.title}`
        nprogress.done() // 进度条结束
    })
}
